package com.wpan.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;

/**
 * 1 整合MyBatis-Plus
 *      (1)导入依赖
 *          <dependency>
 *              <groupId>com.baomidou</groupId>
 *              <artifactId>mybatis-plus-boot-starter</artifactId>
 *              <version>**.**.**</version>
 *          </dependency>
 *      (2)配置
 *          配置数据源
 *              导入数据库驱动
 *              在application.yml配置数据源
 *          配置MyBatis-Plus
 *              首先需要在启动类添加注解@MapperScan("")来告诉MyBatis-Plus Mapper接口都在哪里
 *              由于每一个Mapper都生成了映射文件 所以也需要告诉MyBatis—Plus这些映射文件砸在哪里 这一步需要在在application.yml配置文件中 设置
 *          设置主键自增
 * 2 逻辑删除
 *      配置application.yml
 *          mybatis-plus:
 *              global-config:
 *                  db-config:
 *                      logic-delete-value: 1 逻辑删除值 默认1
 *                      logic-not-delete-value: 0 逻辑未删除值 默认0
 *                      注意 1 的那句是要删除的值
 *                      0则是不需要删除
 *       需要在实体类上面给逻辑删除表示字段加上注解 : @TableLogic
 * 3 后端效验
 *      主要使用 JSR303 Java规范体验 303号
 *          它规定了数据效验相关的标准
 *      首先需要给需要效验的数据(Bean)加上效验注解 这些注解都在
 *          javax.validation.constraints
 *      在提交数据的时候告诉SpringMVC这个数据需要效验 在提交的 Controller 的方法中 添加注解
 *          @Valid  告诉SpringMVC这个字段是需要效验的
 *      开启效验功能 @Value
 *          效果 效验错误后会有默认的响应
 *      给校验的Bean后紧跟一个BindingResult就可以获取到效验的结果
 * 4 统一异常处理
 *      可以使用SpringMVC提供的ControllerAdvice
 * 5 分组效验
 *      使用 效验里面的属性 groups 来标注这个效验属于哪一种情况
 *      groups = {AddGroup.class,UpdateGroup.class}
 *          在效验注解中标注什么情况需要进行效验
 *      在Controller中告诉它 这是什么情况 然后进行相对应的效验
 *      替换掉 @Valid 注解 转而使用 @Validated
 *      @Validated
 *          这是Spring框架提供的注解 而@Valid这是规范
 *          它可以指定一个或者多个效验分组 然后就会按照指定的分组进行效验
 *              @Validated({AddGroup.class})
 *          默认没有指定分组的效验注解 在分组效验的情况下不生效 只会在不分组的情况下生效
 *              如在另外一个Controller的时候告诉它需要进行效验但是不分组的情况下 那些没有指定分组的就会生效
 * 6 自定义效验
 *      首先需要自己编写一个自定义的效验注解
 *      然后编写一个自定义的效验器
 *      让这个效验器来效验它所标注的字段 也就是关联  自定义的效验器  自定义的效验注解
 */
@MapperScan("com.wpan.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
/*
    @EnableFeignClients
        开启远程调用功能
        basePackages
            告诉SpringCloud这些远程调用接口在哪里 不过就算不告诉 它也会自动扫描到标注了 @FeignClient 注解的接口
 */
@EnableFeignClients(basePackages = "com.wpan.gulimall.product.feign")
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
